%pylab inline
import collections
#import plotly.plotly as py
#from plotly.graph_objs import *
#from plotly.offline import init_notebook_mode,iplot
#init_notebook_mode()
from IPython.core.display import HTML
HTML('''<script>
code_show=true;
function code_toggle() {
if (code_show){
$('div.input').hide();
} else {
$('div.input').show();
}
code_show = !code_show
}
$( document ).ready(code_toggle);
</script>
<form action="javascript:code_toggle()"><input type="submit"
value="Click here to toggle on/off the raw code."></form>''')
# Az abra kimentesehez az alabbiakat a plt.show() ele kell tenni!!!
#savefig('fig_rainbow_p2_1ray.pdf'); # Abra kimentese
#savefig('fig_rainbow_p2_1ray.eps'); # Abra kimentese
# Abra es fontmeretek
xfig_meret= 6 # 12 nagy abrahoz
yfig_meret= 6 # 12 nagy abrahoz
xyticks_meret= 15 # 20 nagy abrahoz
xylabel_meret= 20 # 30 nagy abrahoz
legend_meret= 21 # 30 nagy abrahoz
def free_en(kp, Gvec):
# Gvec ---> G vectors
eig_en = []
for G in Gvec:
eig_en.append(dot((kp-G),(kp-G)))
return sort(eig_en)
def Ham_op(kv, Gvec, params):
# Dirac-delta szennyezok a racsatomokon
# Hsize = the size of the ham matrix, input
w = params # w ----> a Dirac-delta potencial erossege, input
Hsize = len(Gvec)
Ham = w*ones((Hsize,Hsize)) # a Ham Hamiltonian matrix minden eleme = w
# a Ham diagonalis elemei = a kinetic energy:
i=0
for g in Gvec:
Ham[i,i] = dot(kv-g,kv-g)
i +=1
return Ham
def rajz_contour(X,Y,dat,ncont):
# az elso negy sav contour plotja
# X ---> a kx pontok
# Y ---> a ky pontok
# dat ---> a
# ncont = a contour-vonalak szama, pl. ncont = 11
# ncont = a contour-vonalak szama, pl. ncont = 11
# reading the eigenvalues from 'dat'
# az elso negy beolvasasa a Z1, Z2, Z3, Z4 array-be:
Z1 = reshape(dat[:,0],(kpoints, kpoints))
Z2 = reshape(dat[:,1],(kpoints, kpoints))
Z3 = reshape(dat[:,2],(kpoints, kpoints))
Z4 = reshape(dat[:,3],(kpoints, kpoints))
figsize(xfig_meret,yfig_meret)
subplot(2,2,1,aspect='equal')
cp=contour(X, Y, Z1, ncont, alpha=1, colors='blue', linestyles='-',linewidths=2)
clabel(cp, inline=True, fontsize=10)
#korutvonal() # a Gamma--M--K--Gamma korutat rajzolja ki
#BZkorut()
text(Xp[0],Xp[1], r'X', fontsize=xylabel_meret,color='red')
text(Mp[0],Mp[1], r'M', fontsize=xylabel_meret,color='red')
text(0,0, r'$\Gamma$', fontsize=xylabel_meret,color='red')
title(r'$E_1({\bf k})$',fontsize=xylabel_meret)
xlabel(r'$k_x$',fontsize=xylabel_meret)
ylabel(r'$k_y$',fontsize=xylabel_meret)
xticks(fontsize=xyticks_meret)
yticks(fontsize=xyticks_meret);
grid();
subplot(2,2,2,aspect='equal')
cp=contour(X, Y, Z2, ncont, alpha=1, colors='green', linestyles='-',linewidths=2)
clabel(cp, inline=True, fontsize=10)
#korutvonal() # a Gamma--M--K--Gamma korutat rajzolja ki
#BZkorut()
text(Xp[0],Xp[1], r'X', fontsize=xylabel_meret,color='red')
text(Mp[0],Mp[1], r'M', fontsize=xylabel_meret,color='red')
text(0,0, r'$\Gamma$', fontsize=xylabel_meret,color='red')
title(r'$E_2({\bf k})$',fontsize=xylabel_meret)
xlabel(r'$k_x$',fontsize=xylabel_meret)
ylabel(r'$k_y$',fontsize=xylabel_meret)
xticks(fontsize=xyticks_meret)
yticks(fontsize=xyticks_meret);
grid();
subplot(2,2,3,aspect='equal')
cp=contour(X, Y, Z3, ncont, alpha=1, colors='orange', linestyles='-',linewidths=2)
clabel(cp, inline=True, fontsize=10)
#korutvonal() # a Gamma--M--K--Gamma korutat rajzolja ki
#BZkorut()
text(Xp[0],Xp[1], r'X', fontsize=xylabel_meret,color='red')
text(Mp[0],Mp[1], r'M', fontsize=xylabel_meret,color='red')
text(0,0, r'$\Gamma$', fontsize=xylabel_meret,color='red')
title(r'$E_3({\bf k})$',fontsize=xylabel_meret)
xlabel(r'$k_x$',fontsize=xylabel_meret)
ylabel(r'$k_y$',fontsize=xylabel_meret)
xticks(fontsize=xyticks_meret)
yticks(fontsize=xyticks_meret);
grid();
subplot(2,2,4,aspect='equal')
cp=contour(X, Y, Z4, ncont, alpha=1, colors='red', linestyles='-',linewidths=2)
clabel(cp, inline=True, fontsize=10)
#korutvonal() # a Gamma--M--K--Gamma korutat rajzolja ki
#BZkorut()
text(Xp[0],Xp[1], r'X', fontsize=xylabel_meret,color='red')
text(Mp[0],Mp[1], r'M', fontsize=xylabel_meret,color='red')
text(0,0, r'$\Gamma$', fontsize=xylabel_meret,color='red')
title(r'$E_4({\bf k})$',fontsize=xylabel_meret)
xlabel(r'$k_x$',fontsize=xylabel_meret)
ylabel(r'$k_y$',fontsize=xylabel_meret)
xticks(fontsize=xyticks_meret)
yticks(fontsize=xyticks_meret);
grid();
tight_layout() # a szomszedos x,y tengelyfeliratok NE fedjenek at.
#savefig('fifi.eps'); # Abra kimentese
#show();
# 2D square lattice, unit cell:
b1 = 2*pi*array([1,0])
b2 = 2*pi*array([0,1])
# creating 2D square lattice reciprocal vectors:
Gnum = 2 #### (2*Gnum+1)*(2*Gnum+1) number of Gvec
indx=array(range(-Gnum,Gnum+1))
Gvec = []
for n1 in indx:
for n2 in indx:
Gvec.append(n1*b1+n2*b2)
# Gamma, M es X pontok a Brillouin-zonaban:
Gp = array([0,0])
Xp=b1/2
Mp=(b1+b2)/2
print("Number of G vectors included in the calculation = ", len(Gvec))
# creating sample of k points
kpoints = 50 # number of k points in the Brillouin zone
kran=linspace(-pi,pi,kpoints ) # Brilloin zone 2*pi x 2*pi square
X,Y=meshgrid(kran,kran)
kgrid=transpose(array([X.flatten(),Y.flatten()]))
# calculating the eigenvalues at each k points in the Brillouin zone
w = 0 #### w ---> a Dirac-delta potencial erossege, input
params=[w]
print("w =", w)
Hsize=len(Gvec) # Hsize = the size of the ham matrix, input
print("The size of the Hamiltonian =", Hsize)
dat=[] # dat ---> array of the eigenvalues at each k points
for kv in kgrid:
dat.append(eigvalsh(Ham_op(kv, Gvec, params)))
dat=array(dat)
ncont = 7 # a contour-vonalak szama, pl. ncont = 11
rajz_contour(X,Y,dat,ncont)
#savefig('fifi1a.eps'); # Abra kimentese
print("w =", w)
print("The size of the Hamiltonian =", Hsize)
# reading the eigenvalues from 'dat'
# az elso 2 beolvasasa a Z1, Z2 array-be:
Z1 = reshape(dat[:,0],(kpoints, kpoints))
Z2 = reshape(dat[:,1],(kpoints, kpoints))
ncont = 17 # a contour-vonalak szama, pl. ncont = 11
e_szintek = [4,12,14] # ezek a kontans energia ertekek
figsize(xfig_meret,yfig_meret)
subplot(1,1,1,aspect='equal')
cp1=contour(X, Y, Z1, levels=e_szintek, alpha=1, colors='blue', linestyles='-',linewidths=2)
clabel(cp1, inline=True, fontsize=10)
cp2=contour(X, Y, Z2, levels=e_szintek, alpha=1, colors='green', linestyles='--',linewidths=2)
clabel(cp2, inline=True, fontsize=10)
grid();
#savefig('fifi1b.eps'); # Abra kimentese
## Fermi energies
print("w =", w)
print("The size of the Hamiltonian =", Hsize)
# reading the eigenvalues from 'dat'
# az elso 2 beolvasasa a Z1, Z2 array-be:
Z1 = reshape(dat[:,0],(kpoints, kpoints))
Z2 = reshape(dat[:,1],(kpoints, kpoints))
ncont = 17 # a contour-vonalak szama, pl. ncont = 11
### Brillouin zone Volume:
VBZ= abs(cross(b1,b2))
print("Volume of the Brilouin zone = ", VBZ,"\n")
### Fermi energy:
EF_vec = []
for n in range(1,8):
tmp = (2*pi*n)
EF_vec.append(tmp)
print("Electrons per unit cell = ", n, ", Fermi energy = ",round(tmp,3))
# EF_vec # ezek a Fermi energiak
figsize(xfig_meret,yfig_meret)
subplot(1,1,1,aspect='equal')
cp1=contour(X, Y, Z1, levels=EF_vec, alpha=1, colors='blue', linestyles='-',linewidths=2)
clabel(cp1, inline=True, fontsize=10)
cp2=contour(X, Y, Z2, levels=EF_vec, alpha=1, colors='green', linestyles='--',linewidths=2)
clabel(cp2, inline=True, fontsize=10)
cim = "square lattice, w="+str(0)
title(cim,fontsize=xylabel_meret)
grid();
grid();
#savefig('fifi1b.eps'); # Abra kimentese
# calculating the eigenvalues at each k points in the Brillouin zone
w = -1. #### w ---> a Dirac-delta potencial erossege, input
params=[w]
print("w =", w)
Hsize=len(Gvec) # Hsize = the size of the ham matrix, input
print("The size of the Hamiltonian =", Hsize)
dat=[] # dat ---> array of the eigenvalues at each k points
for kv in kgrid:
dat.append(eigvalsh(Ham_op(kv, Gvec, params)))
dat=array(dat)
ncont = 7 # a contour-vonalak szama, pl. ncont = 11
figsize(xfig_meret,yfig_meret)
rajz_contour(X,Y,dat,ncont)
#savefig('fifi2a.eps'); # Abra kimentese
print("w =", w)
print("The size of the Hamiltonian =", Hsize)
# reading the eigenvalues from 'dat'
# az elso 2 beolvasasa a Z1, Z2 array-be:
Z1 = reshape(dat[:,0],(kpoints, kpoints))
Z2 = reshape(dat[:,1],(kpoints, kpoints))
ncont = 8 # a contour-vonalak szama, pl. ncont = 11
e_szintek = [12,14] # ezek a kontans energia ertekek
figsize(xfig_meret,yfig_meret)
subplot(1,1,1,aspect='equal')
cp1=contour(X, Y, Z1, levels=e_szintek, alpha=1, colors='blue', linestyles='-',linewidths=2)
clabel(cp1, inline=True, fontsize=10)
cp2=contour(X, Y, Z2, levels=e_szintek, alpha=1, colors='green', linestyles='--',linewidths=2)
clabel(cp2, inline=True, fontsize=10)
cim = "square lattice, w="+str(w)
title(cim,fontsize=xylabel_meret)
grid();
#savefig('fifi2b.eps'); # Abra kimentese
## Fermi energies
print("w =", w)
print("The size of the Hamiltonian =", Hsize)
# reading the eigenvalues from 'dat'
# az elso 2 beolvasasa a Z1, Z2 array-be:
Z1 = reshape(dat[:,0],(kpoints, kpoints))
Z2 = reshape(dat[:,1],(kpoints, kpoints))
ncont = 17 # a contour-vonalak szama, pl. ncont = 11
### Brillouin zone Volume:
VBZ= abs(cross(b1,b2))
print("Volume of the Brilouin zone = ", VBZ,"\n")
### Fermi energy:
EF_vec = []
for n in range(1,8):
tmp = (2*pi*n)
EF_vec.append(tmp)
print("Electrons per unit cell = ", n, ", Fermi energy = ",round(tmp,3))
# EF_vec # ezek a Fermi energiak
figsize(xfig_meret,yfig_meret)
subplot(1,1,1,aspect='equal')
cp1=contour(X, Y, Z1, levels=EF_vec, alpha=1, colors='blue', linestyles='-',linewidths=2)
clabel(cp1, inline=True, fontsize=10)
cp2=contour(X, Y, Z2, levels=EF_vec, alpha=1, colors='green', linestyles='--',linewidths=2)
clabel(cp2, inline=True, fontsize=10)
cim = "square lattice, w="+str(w)
title(cim,fontsize=xylabel_meret)
grid();
grid();
#savefig('fifi1b.eps'); # Abra kimentese
figsize(xfig_meret,yfig_meret)
subplot(1,1,1,aspect='equal')
contourf(X,Y,Z2,levels=linspace(8,17,10))
#contourf(X,Y,Z1,)
#pcolor(X,Y,Z1)
colorbar()
grid();
## No potential, free electron in square lattice
## square lattice reciprocal vectors:
## in units of 2 pi/a
Npoints = 50; ## hany pontbol keszul a gorbe
ymax = 120;
Gnum = 2 # the number of G vectors = (2*Gnum+1)*(2*Gnum+1)
w=0 ## empty lattice
print("w =", w)
#print("The size of the Hamiltonian =", len(Gvec))
print("The # of G vectors = (2*Gnum+1)*(2*Gnum+1) = ", (2*Gnum+1)*(2*Gnum+1))
## high symmetry points in the Brillouin zone
## FONTOS: a fenti abra szerinti pontokat kell venni,
## a szomszedos spec. k pontokat kell venni.
Gp = array([0,0])
Xp = b1/2
Mp = (b1+b2)/2
## G-X-M-G line
specpoints = array([Gp,Xp,Mp,Gp])
klist = []
specpos = [0]
kk = [0]
tmp = 0
for i in (range(len(specpoints)-1)):
sl = specpoints[i+1]-specpoints[i]
sl_hossz = sqrt(dot(sl,sl))
dk = sl/Npoints
for num in arange(0,Npoints):
# k vector along the line given by speclines:
klist.append(specpoints[i] + num*dk)
# length of the k vector and shifted:
tmp += sqrt(dot(dk,dk))
kk.append(tmp)
specpos.append(tmp)
klist.append(klist[-1]+dk)
enlist = []
for i in klist:
enlist.append(free_en(i, Gvec))
enlist= array(enlist)
eigszam= len(enlist[0,:])
print("The # of eigenvalues = # of G vectors = ",eigszam)
# drawing the figure
figsize(xfig_meret,yfig_meret)
for ii in range(0,len(enlist[0,:])):
plot(kk,enlist[:,ii],color='r')
specNev = ["$\Gamma$","$X$","$M$","$\Gamma$"]
i = 0
for xc in specpos:
axvline(x=xc,color='b')
text(xc,-7,specNev[i],fontsize=xylabel_meret)
i=i+1
ylabel(r'$E(k)$',fontsize=xylabel_meret)
# kikapcsoljuk a xticks:
xticks([], [])
xlim(0,specpos[-1])
ylim(0,ymax)
title("square lattice",fontsize=xylabel_meret)
grid();
#savefig('fifi3a.eps'); # Abra kimentese
## Dirac delta potential at the lattice points, quasi free electron in square lattice
## square lattice reciprocal vectors:
## in units of 2 pi/a
Npoints = 50; ## hany pontbol keszul a gorbe
ymax = 120;
Gnum = 2 # the number of G vectors = (2*Gnum+1)*(2*Gnum+1)
w = -1 #### w = 4.2 ----> a Dirac-delta potencial erossege, input
params=[w]
print("The # of G vectors = (2*Gnum+1)*(2*Gnum+1) = ", (2*Gnum+1)*(2*Gnum+1))
print("w = ",w)
## high symmetry points in the Brillouin zone
## FONTOS: a fenti abra szerinti pontokat kell venni,
## a szomszedos spec. k pontokat kell venni.
Gp = array([0,0])
Xp = b1/2
Mp = (b1+b2)/2
## G-X-M-G line
specpoints = array([Gp,Xp,Mp,Gp])
klist = []
specpos = [0]
kk = [0]
tmp = 0
for i in (range(len(specpoints)-1)):
sl = specpoints[i+1]-specpoints[i]
sl_hossz = sqrt(dot(sl,sl))
dk = sl/Npoints
for num in arange(0,Npoints):
# k vector along the line given by speclines:
klist.append(specpoints[i] + num*dk)
# length of the k vector and shifted:
tmp += sqrt(dot(dk,dk))
kk.append(tmp)
specpos.append(tmp)
klist.append(klist[-1]+dk)
Hsize= (2*Gnum+1)*(2*Gnum+1) # Hsize = the size of the ham matrix, input
enlistw = []
for kv in klist:
enlistw.append(eigvalsh(Ham_op(kv, Gvec, params)))
enlistw= array(enlistw)
eigszam= len(enlistw[0,:])
print("The # of eigenvalues = # of G vectors = ",eigszam)
# drawing the figure
figsize(10,5)
subplot(1,2,1)
for ii in range(0,len(enlist[0,:])):
plot(kk,enlist[:,ii],color='r')
specNev = ["$\Gamma$","$X$","$M$","$\Gamma$"]
i = 0
for xc in specpos:
axvline(x=xc,color='b')
text(xc,-9,specNev[i],fontsize=xylabel_meret)
i=i+1
ylabel(r'$E(k)$',fontsize=xylabel_meret)
# kikapcsoljuk a xticks:
xticks([], [])
xlim(0,specpos[-1])
ylim(0,ymax)
cim = "square lattice, w="+str(0)
title(cim,fontsize=xylabel_meret)
grid();
subplot(1,2,2)
for ii in range(0,len(enlist[0,:])):
plot(kk,enlistw[:,ii],color='r')
specNev = ["$\Gamma$","$X$","$M$","$\Gamma$"]
i = 0
for xc in specpos:
axvline(x=xc,color='b')
text(xc,-9,specNev[i],fontsize=xylabel_meret)
i=i+1
#ylabel(r'$E(k)$',fontsize=xylabel_meret)
# kikapcsoljuk a xticks:
xticks([], [])
xlim(0,specpos[-1])
ylim(0,ymax)
cim = "square lattice, w="+str(w)
title(cim,fontsize=xylabel_meret)
grid();
## calculation of degeneracy
print("\nDegeneracy at the special k points without Dirac delta potential: \n=================================\n")
params0=[0]
i=0
for sp in specpoints:
se = eigvalsh(Ham_op(sp, Gvec, params0))
sajatertekek =[ round(x,2) for x in se]
deg=collections.Counter(sajatertekek);
keys = sorted(deg.keys())
print("\nDegeneracies in the %s point:" % specNev[i])
for element in keys:
print("Energy: %.2f, degeneracy: %d" % ( element, deg[element]))
i +=1
szoveg="\nDegeneracy at the special k points, with Dirac delta potential, w="+str(w)+":\n=================================\n"
print(szoveg)
i=0
for sp in specpoints:
se = eigvalsh(Ham_op(sp, Gvec, params))
sajatertekek =[ round(x,2) for x in se]
deg=collections.Counter(sajatertekek)
keys = sorted(deg.keys())
print("\n degeneracies in the %s point:" % specNev[i])
for element in keys:
print("Energy: %.2f, degeneracy: %d" % ( element, deg[element]))
i +=1
#savefig('fifi3b.eps'); # Abra kimentese